import datetime
import re


class DateTool(object):
    """
    日期格式工具类
    所有功能通过静态方法完成
    """

    @staticmethod
    def is_valid_date(date_str):
        """
        判断一个字符串是否是有效日期（格式为 "YYYY-MM-DD"，且是一个真实存在的日期）

        Args:
            date_str (str): 待检验的日期字符串

        Returns:
            bool: 如果是有效日期返回True，否则返回False
        """
        # 检查格式是否为 YYYY-MM-DD
        pattern = r'^\d{4}-\d{2}-\d{2}$'
        if not re.match(pattern, date_str):
            return False

        try:
            # 尝试将字符串转换为日期对象
            datetime.datetime.strptime(date_str, '%Y-%m-%d')
            return True
        except ValueError:
            # 如果转换失败，说明日期不合法（如2月30日等）
            return False

    @staticmethod
    def days_between(date1, date2):
        """
        计算两个有效日期之间相差多少天

        Args:
            date1 (str): 第一个日期字符串（格式：YYYY-MM-DD）
            date2 (str): 第二个日期字符串（格式：YYYY-MM-DD）

        Returns:
            int/str: 如果日期有效返回相差天数，否则返回错误提示
        """
        # 检查两个日期是否都有效
        if not DateTool.is_valid_date(date1):
            return f"错误：'{date1}' 不是有效日期"
        if not DateTool.is_valid_date(date2):
            return f"错误：'{date2}' 不是有效日期"

        try:
            # 将字符串转换为日期对象
            d1 = datetime.datetime.strptime(date1, '%Y-%m-%d').date()
            d2 = datetime.datetime.strptime(date2, '%Y-%m-%d').date()
            print("d1, d2:", d1, d2)

            # 计算日期差
            delta = abs((d2 - d1).days)
            print("delta:", delta)
            return delta
        except Exception as e:
            return f"计算日期差时发生错误：{str(e)}"


# 主程序：测试这些方法
if __name__ == "__main__":
    # print("=== 日期有效性测试 ===")
    # test_dates = [
    #     "2023-01-01",  # 有效日期
    #     "2023-02-29",  # 无效日期（2023年不是闰年）
    #     "2023-13-01",  # 无效日期（13月不存在）
    #     "2023-12-31",  # 有效日期
    #     "2023/12/31",  # 格式错误
    #     "2023-1-1",  # 格式错误（月份和日期应该是两位数）
    #     "2024-02-29",  # 有效日期（2024年是闰年）
    # ]

    # for date in test_dates:
    #     result = DateTool.is_valid_date(date)
    #     print(f"{date}: {'有效' if result else '无效'}")
    #
    print("\n=== 日期差计算测试 ===")
    test_pairs = [
        ("2023-01-01", "2023-01-10"),  # 正常情况
        # ("2023-01-01", "2023-02-29"),  # 包含无效日期
        # ("2023-12-31", "2024-01-01"),  # 跨年
        # ("2024-02-28", "2024-03-01"),  # 跨月（闰年2月）
        # ("2023-01-01", "2023/01/10"),  # 格式错误
    ]

    for date1, date2 in test_pairs:
        result = DateTool.days_between(date1, date2)
        print(f"{date1} 到 {date2}: {result}")
